#include "command.h"
// #include "login.h"
#include "loginRegister.h"

/* Usage: ./client 127.0.0.1 12345*/
int main(int argc, char *argv[])
{
    /* ARGS_CHECK(argc, 3); */
    argv[1] = "127.0.0.1";
    argv[2] = "12345";
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(atoi(argv[2]));
    addr.sin_addr.s_addr = inet_addr(argv[1]);

    int ret = connect(sockfd, (struct sockaddr *)&addr, sizeof(addr));
    ERROR_CHECK(ret, -1, "connect");
    int log_fd = open("client.log", O_RDWR | O_CREAT | O_APPEND, 0666);

    while(1)
    {
        printf("1.登录 2.注册\n");
        int flag_sign = 0;
        scanf("%d", &flag_sign);
        if(flag_sign != 1 && flag_sign != 2)
        {
            printf("输入错误，请重新输入！\n");
            while (getchar() != '\n');
            continue;
        }
        if (flag_sign == 2) // 注册
        {
            while (getchar() != '\n');
            // int ret = sign_up(sockfd);
            int ret = user_register(sockfd);
            if(ret == 0)
            {
                LOG_INFO(log_fd, LOG_SIGNUP, "用户注册成功");
                printf("注册成功！\n");
                break;
            }
            else
            {
                LOG_INFO(log_fd, LOG_SIGNUP, "用户注册失败");
                // 这里可以记录注册失败的原因, 比如用户名已存在等
                // 但为了简化, 我们只记录注册失败
                // 的情况, 具体原因由服务端返回的消息决定
                printf("注册失败，请重试！\n");
                continue;
            }
        }
        else // 登录
        {
            while (getchar() != '\n');
            // int ret = sign_in(sockfd);
            int ret = user_login(sockfd);
            if(ret == 0)
            {
                break;
            }
        }
    }

    // 登陆之后打印一次客户端本地的当前目录有哪些文件
    print_files_in_dir();

    // 打开日志文件
    LOG_INFO(log_fd, LOG_SIGNIN, "客户端启动，连接到服务器 %s:%s", argv[1], argv[2]);
    
    while (1)
    {
        // 注释部分可能发生两次函数调用, 作为警醒, 保留!
        // if(-1 == validate_and_parse_command(sockfd) || -2 == validate_and_parse_command(sockfd)){
        //    continue;
        //}
        int ret = validate_and_parse_command(sockfd, log_fd);
        if (-1 == ret || -2 == ret)
        {
            continue;
        }
    }

    LOG_INFO(log_fd, LOG_OPERATION,"客户端退出");
    close(log_fd);
    close(sockfd);
    return 0;
}